package com.zhonglz.util.jwt;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.zhonglz.commons.interceptor.SystemInterceptor;

/****
 * jwt工具类
 * @author xiaozhong
 */
public class JwtUtils {
	private static Logger logger = LoggerFactory.getLogger(JwtUtils.class);
	
	 //SING签名的设置，不能对外暴露
    public static final String SING = "token!J1JK3JH^&g%f*f@f*(f!)fs*#s*$H3J4DK43";

    /****
     * 生成token
     * @param map 集合存入payload信息
     * @return token
     */
    public static String getToken(Map<String, String> map) {
        //设置令牌的过期时间
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DAY_OF_MONTH, 1);//六个小时过期
        //创建JWT builder
        JWTCreator.Builder builder = JWT.create();
        //payload
        map.forEach((k, v) -> {
            builder.withClaim(k, v);
        });
        logger.debug("时间L"+instance.getTime());
        String token = builder.withExpiresAt(instance.getTime()) //指定令牌过期时间
                .sign(Algorithm.HMAC256(SING));
        return token;
    }

    
    /****
     * 验证令牌是否合法
     * @param token
     */
    public static void verify(String token) {
        JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    }

   
    /****
     * 获取JWT的信息
     * @param token
     * @return
     */
    public static DecodedJWT getTokenInfo(String token) {
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
        return verify;
    }
    
    
    //测试
    public static void main(String[] args) {
    	//创建得到token
    	logger.info("----------------创建token开始-------------------");
    	
    	
    	Map<String, String> map=new HashMap<String, String>();
		map.put("userId", "123");
		map.put("username", "admin");
		map.put("realName", "admin123");
		
		String token = JwtUtils.getToken(map);
    	
//    	//定义获取时间
//    	Calendar instance = Calendar.getInstance();
//    	//对生成的时间设置多少秒
//    	instance.add(Calendar.SECOND,10000);
//    	logger.debug(instance.getTime());
//    	//生成令牌
//    	String token = JWT.create()
//    	        .withClaim("username", "zhonglz")//设置自定义属性
//    	        .withClaim("userId",123456)
//    	        .withExpiresAt(instance.getTime())//设置过期时间
//    	        .sign(Algorithm.HMAC256(SING));
    	//输出令牌
		logger.info("token:"+token);
		logger.info("----------------创建token结束-------------------");
		logger.info("----------------验证token是否合法开始-------------------");
//    	try {
//			Thread.sleep(2000);
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
    	verify(token);
    	logger.info("----------------验证token是否合法结束-------------------");
    	
    	//解析token 取出在signature里存入的值
    	logger.info("----------------解析token开始-------------------");
    	//创建验证对象
    	
    	 DecodedJWT verify = JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    	 logger.info(verify.getClaim("username").asString());//获取添加的数据->进行取出
    	 logger.info(verify.getClaim("userId").asString());//获取添加的数据->进行取出
    	 logger.info("过期时间："+verify.getExpiresAt());
    	 logger.info("----------------解析token结束-------------------");
	}
    
}
